package com.boat.starter.p6spy.context;

import java.util.concurrent.TimeUnit;

import lombok.Data;

/**
 * 线程上下文，用于跨层传参
 * 
 * @author 周江
 *
 */

public class Context {
	/**
	 * 记录数
	 */
	private static final ThreadLocal<SqlLogInfo> SQLLOGINFO_CONTEXT = new ThreadLocal<>();

	public static void setSqlLogInfo(SqlLogInfo info) {
		SQLLOGINFO_CONTEXT.set(info);
	}

	public static SqlLogInfo getSqlLogInfo() {
		SqlLogInfo info = SQLLOGINFO_CONTEXT.get();
		if (info == null) {
			info = new SqlLogInfo();
			setSqlLogInfo(info);
		}
		return info;
	}

	public static void clear() {
		SQLLOGINFO_CONTEXT.remove();
	}

	@Data
	public static class SqlLogInfo {
		// 替换占位符后的sql
		String sql;
		// 有占位符的sql
		String prepared;
		//耗时
		long times;
		int connectionId;
		//数据库连接
		String url;
		// 是否select语句
		boolean selectSql;
		//select语句记录数
		int rowCount = 0;

		public void incRowCount() {
			rowCount++;
		}

		public void setTimes(long elapsedNanos) {
			// 纳秒转换为毫秒
			times = TimeUnit.NANOSECONDS.toMillis(elapsedNanos);
		}

		public boolean isSelectSql() {
			if (sql == null) {
				return false;
			}

			return sql.toLowerCase().trim().startsWith("select");
		}
	}
}
